package com.didispace.alibaba.sentinel.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;


@Slf4j
@Service
public class TestService {

    private static Logger log = LoggerFactory.getLogger(TestService.class);

    // 限流与阻塞处理  主要做了两件事： 1 通过@SentinelResource注解的blockHandler属性制定具体的处理函数
    // 2 实现处理函数，该函数的传参必须与资源点的传参一样，并且最后加上BlockException异常参数；同时，返回类型也必须一样。
    @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler")
    public void doSomeThing(String str) {
        log.info(str);
    }

    public void exceptionHandler(String str, BlockException ex) {
        log.error("blockHandler：" + str, ex);
    }

    // 熔断与降级处理
    @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常"); // 该方法会抛出异常，以配合后续制定基于异常比例的降级策略（类似Hystrix）。
    }                                           // Sentinel相比Hystrix更丰富，还有基于响应时间和异常数的降级策略

    public void fallbackHandler(String str) {
        log.error("fallbackHandler：" + str);
    }

}